import dayjs from 'dayjs';

type _fe1 = '-' | '' | '/'; // 限制年月日的分隔符
type _fe2 = ':' | ''; // 限制时分秒的分隔符
type _fe3 = ' ' | ''; // 限制日期和时间链接符

/**
 * 日期转换成字符串
 * @param dateObj - 日期对象 或者 时间戳
 * @param fe1 - 用什么分割年月日 默认中横线
 * @param fe2 - 用什么分割时分秒 默认冒号
 * @param fe3 - 日期和时间链接符 默认空格
 * @returns 日期字符串 如：(2101-02-02)
 */
export function formatDateTimeStr(dateObj: Date | number = new Date(), fe1: _fe1 = '-', fe2: _fe2 = ':', fe3: _fe3 = ' ') {
  const date = typeof dateObj === 'number' ? new Date(dateObj) : dateObj;
  const year = String(date.getFullYear());
  let month = String(date.getMonth() + 1);
  month = month.length > 1 ? month : `0${month}`;
  let day = String(date.getDate());
  day = day.length > 1 ? day : `0${day}`;
  let hour = String(date.getHours());
  hour = hour.length > 1 ? hour : `0${hour}`;
  let minute = String(date.getMinutes());
  minute = minute.length > 1 ? minute : `0${minute}`;
  let second = String(date.getSeconds());
  second = second.length > 1 ? second : `0${second}`;
  return [year, month, day].join(fe1) + fe3 + [hour, minute, second].join(fe2);
}

/**
 * 日期转换成字符串
 * @param dateObj - 日期对象 或者 时间戳
 * @returns 日期字符串 如：(2101-02-02)
 */
export function formatDateStr(dateObj: Date | number = new Date()): string {
  const date = typeof dateObj === 'number' ? new Date(dateObj) : dateObj;
  const year = String(date.getFullYear());
  let month = String(date.getMonth() + 1);
  month = month.length > 1 ? month : `0${month}`;
  let day = String(date.getDate());
  day = day.length > 1 ? day : `0${day}`;
  return [year, month, day].join('-');
}

/**
 * 格式化成Date对象
 * date  { Date, String, Array ,Number}
 * @example 可格式化如下：
 *   [2021,10,11]  注意第一个为年,第二个为月,第三个为日 月份是从0开始,即0代表1月份,11代表12月
 *   '2021-10-11 12:21:21' , '2021/10/11 12:21:21' , '2021年10月11日12时23分23秒'  三种日期字符串[可以是精确到天的字符串如：'2021-10-11']
 *   new Date() 日期对象
 *   1631174240 [即时间戳]
 */
export function formatDate(date: $FormatDate) {
  try {
    let newDate = new Date();
    if (date instanceof Date) {
      newDate = date;
    } else if (Array.isArray(date)) {
      newDate = new Date(...date);
    } else if (typeof date === 'string') {
      let dataStr = date.replace(/-|年|月/g, '/').replace(/日/, ' '); // 把日期的占位符替换为斜杠(中文的日后可能没有空格所以要替换成空格,后面在去掉)
      dataStr = dataStr.replace(/时|分|：/g, ':').replace(/秒/, '');
      dataStr = dataStr.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, ''); // 去掉连续空格(解决如果日有空格会生成多个空格)和首尾空格
      dataStr = dataStr.substring(0, 19);
      newDate = new Date(dataStr);
    } else {
      newDate = new Date(date);
    }
    return newDate instanceof Date ? newDate : false;
  } catch (error) {
    return false;
  }
}

/**
 * 得到本周周一的时间 (返回一个Date对象)
 */
export function getMonday() {
  const date = new Date();
  const day = date.getDay() || 7; // 0代周日
  return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1 - day); // 本周一
}

/**
 * 得到当前日期到指定天数前的日期集合
 */
export function getDateRange(targetDay: number) {
  const result: string[] = [];
  const toDay = dayjs().format('YYYY-MM-DD');
  result.push(toDay);
  for (let i = 1; i < targetDay; i++) {
    const beforeDay = dayjs(toDay).subtract(i, 'day').format('YYYY-MM-DD');
    result.push(beforeDay);
  }
  return result.reverse();
}
